/********************************************************************
 * 文件名:	maze.h
 --------------------------------------------------------------------
 * 模块:	迷宫相关操作
 --------------------------------------------------------------------
 * 功能:	迷宫相关操作
 --------------------------------------------------------------------
 * 作者: 	VonKing
 --------------------------------------------------------------------
 * 创建日期：2024-11-23
 --------------------------------------------------------------------
 * 修改日期：2024-11-25
 ********************************************************************/
#pragma once
#ifndef __MAZE_H
#define __MAZE_H

#include<stdio.h>    // 打印输出
#include<time.h>     // 设置随机种子
#include<stdlib.h>   // 包含 malloc 函数
#include<string.h>   // 包含 memset 函数

#define BITS_PER_BYTE 8   // 比特每字节

#define WALL 1    // 墙
#define ROAD 0    // 路

typedef unsigned char u8;



/**
 * 函 数 名:    bit_set
 * 功    能:    将位数组中 (_Row, _Col) 设置为 1
 * 输入参数:    unsigned char   _BitArray   位数组
 *              int             _Size       位数组大小
 *              int             _Row        定位横坐标
 *              int             _Col        定位竖坐标
 * 输出参数:    void                        无返回值
 */
void bit_set(u8* _BitArray, int _Size, int _Row, int _Col);

/**
 * 函 数 名:    bit_get
 * 功    能:    得到位数组中 (_Row, _Col) 的值
 * 输入参数:    unsigned char   _BitArray   位数组
 *              int             _Size       位数组大小
 *              int             _Row        定位横坐标
 *              int             _Col        定位竖坐标
 * 输出参数:    int                         0 或 1
 */
int bit_get(u8* _BitArray, int _Size, int _Row, int _Col);

/**
 * 函 数 名:    bit_clear
 * 功    能:    将位数组中 (_Row, _Col) 设置为 0
 * 输入参数:    unsigned char   _BitArray   位数组
 *              int             _Size       位数组大小
 *              int             _Row        定位横坐标
 *              int             _Col        定位竖坐标
 * 输出参数:    void                        无返回值
 */
void bit_clear(u8* _BitArray, int _Size, int _Row, int _Col);

/**
 * 函 数 名:    maze_init
 * 功    能:    初始化一个位数组（仅偶数行、列为1，其余离散点为0）
 * 输入参数:    int             _Size       迷宫的大小
 * 输出参数:    unsigned char               初始化后的迷宫
 */
u8* maze_init(int _Size);

/**
 * 函 数 名:    maze_create
 * 功    能:    创建一个迷宫
 * 输入参数:    unsigned char   _BitArray   位数组
 *              int             _Size       位数组大小
 *              int             _Row        定位横坐标
 *              int             _Col        定位竖坐标
 * 输出参数:    void                        无返回值
 */
void maze_create(u8* _BitArray, int _Size, int _Row, int _Col);

/**
 * 函 数 名:    create
 * 功    能:    查询当前点坐标周围是否存在道路
 * 输入参数:    unsigned char   _BitArray   位数组
 *              unsigned char   _VisitArray 位数组
 *              int             _Size       位数组大小
 *              int             _Row        定位横坐标
 *              int             _Col        定位竖坐标
 * 输出参数:    void                        无返回值
 */
void create_dfs(u8* _BitArray, u8* _VisitArray, int _Size, int _Row, int _Col);

/**
 * 函 数 名:    maze_clear
 * 功    能:    清除迷宫，将位数组全部置 0
 * 输入参数:    unsigned char   _BitArray   位数组
 *              int             _Size       位数组大小
 * 输出参数:    void                        无返回值
 */
void maze_clear(u8* _BitArray, int _Size);

/**
 * 函 数 名:    is_have_road
 * 功    能:    查询当前点坐标周围是否存在道路
 * 输入参数:    unsigned char   _BitArray   位数组
 *              unsigned char   _VisitArray 位数组
 *              int             _Size       位数组大小
 *              int             _Row        定位横坐标
 *              int             _Col        定位竖坐标
 * 输出参数:    int                         0(没有) / 1(有)
 */
int is_have_road(u8* _BitArray, u8* _VisitArray, int _Size, int _Row, int _Col);

/**
 * 函 数 名:    maze_show
 * 功    能:    将迷宫输出到屏幕
 * 输入参数:    unsigned char   _BitArray   位数组
 *              int             _Size       位数组大小
 * 输出参数:    void                        无返回值
 */
void maze_show(u8* _BitArray, int _Size);

/**
 * 函 数 名:    maze_show_info
 * 功    能:    显示迷宫图中的颜色信息
 * 输入参数:    unsigned char   _BitArray   位数组
 *              int             _Size       位数组大小
 * 输出参数:    void                        无返回值
 */
void maze_show_info(u8* _BitArray, int _Size);

/**
 * 函 数 名:    maze_explore_around
 * 功    能:    显示迷宫图中的颜色信息
 * 输入参数:    unsigned char   _BitArray   位数组
 *              int             _Size       位数组大小
 *              int             _Row        定位横坐标
 *              int             _Col        定位竖坐标
 * 输出参数:    unsigned char               返回值 (_Row, _Col) 坐标上下左右的道路情况[0: 墙，1: 路]
 */
u8* maze_explore_around(u8* _BitArray, int _Size, int _Row, int _Col);
#endif // !__MAZE_H
